package model

import (
	"gorm.io/gorm"
	"math"
)

// PageRequest 分页请求参数
type PageRequest struct {
	Page     int    `form:"page" json:"page"`           // 当前页码
	PageSize int    `form:"page_size" json:"page_size"` // 每页数量
	Sort     string `form:"sort" json:"sort"`           // 排序字段（可选）
	Order    string `form:"order" json:"order"`         // 排序方向（asc/desc，可选）
}

// PageResponse 分页响应数据
type PageResponse[T any] struct {
	Page       int   `json:"page"`        // 当前页码
	PageSize   int   `json:"page_size"`   // 每页数量
	TotalCount int64 `json:"total_count"` // 总记录数
	TotalPages int   `json:"total_pages"` // 总页数
	Data       []T   `json:"data"`        // 当前页数据
}

// Page 通用分页查询方法
func Page[T any](db *gorm.DB, query *gorm.DB, pageRequest PageRequest, out *[]T) (PageResponse[T], error) {
	var totalCount int64
	// 获取总记录数
	if err := query.Count(&totalCount).Error; err != nil {
		return PageResponse[T]{}, err
	}

	// 计算分页参数
	if pageRequest.Page < 1 {
		pageRequest.Page = 1
	}
	if pageRequest.PageSize <= 0 {
		pageRequest.PageSize = 10 // 默认每页 10 条
	}
	offset := (pageRequest.Page - 1) * pageRequest.PageSize

	// 应用排序
	if pageRequest.Sort != "" {
		order := pageRequest.Sort
		if pageRequest.Order == "desc" {
			order += " desc"
		} else {
			order += " asc"
		}
		query = query.Order(order)
	}

	// 查询分页数据
	if err := query.Limit(pageRequest.PageSize).Offset(offset).Find(out).Error; err != nil {
		return PageResponse[T]{}, err
	}

	// 构造分页响应
	totalPages := int(math.Ceil(float64(totalCount) / float64(pageRequest.PageSize)))
	return PageResponse[T]{
		Page:       pageRequest.Page,
		PageSize:   pageRequest.PageSize,
		TotalCount: totalCount,
		TotalPages: totalPages,
		Data:       *out,
	}, nil
}
